home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / iplink / iplinki.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  13.7 KB  |  585 lines

  1. /*    PC98<->IBM<->FMR ファイル転送 for IBM Copyright (c) E.Suto    , 1992-1993    */
  2. /*    修正履歴  Ver  0.00     1992/06/22     試作品                                    */
  3. /*              Ver  0.10     1992/06/23     近所公開版                                */
  4. /*              Ver  0.20     1992/06/26     簡易サーバーモード追加,共用ドライブ対応*/
  5. /*              Ver  0.21     1992/06/28     リモートコマンド追加                    */
  6. /*              Ver  0.30     1992/06/30     TIMEOUT()改造,オプション統合,速度表示    */
  7. /*              Ver  0.31     1992/07/03     簡易サーバーを出来るだけ止めないよう    */
  8. /*              Ver  0.32     1992/07/03     速度表示の0割り算ガード(超手抜き)    */
  9. /*              Ver  0.33     1992/07/06     . の消し方変更                            */
  10. /*              Ver  0.34     1992/07/10     受信ファイルがルートに行ってしまうバグ修正    */
  11. /*              Ver  0.35     1992/11/17     RS232Cのバグ修正(98版のみ)    */
  12. /*              Ver  0.36     1992/11/17     ちょっと高速化(^^;                        */
  13. /*              Ver  0.37     1992/11/18     タイマ値最適化                            */
  14. /*              Ver  0.38     1992/11/18     送信ファイル名バグ修正                    */
  15. /*              Ver  0.39     1992/11/18     サーバーバグ修正                        */
  16. /*              Ver  0.41     1993/02/04     inpのwaitを#defineに                    */
  17. /*              Ver  0.42     1993/02/04     ソースをちょっと統合(^^;                */
  18. /*              Ver  1.00     1993/ 2/ 3     失敗時にタイムアウトしない                */
  19. /*              Ver  1.01     1993/ 2/ 4     コマンド受信処理でタイムアウトしない    */
  20.  
  21. #include "iplink.h"
  22.  
  23. #define PALAWAIT    10l    /* TIMEOUTが発生する場合はこの値を大きくしてね(^^; */
  24.  
  25. static    int                send_cs        ; /* タイミング用CS値                    */
  26. static    unsigned int    rs_line_s    ; /* ラインコントロールステータス        */
  27. static    unsigned int    rs_in        ; /* モデムステータス                    */
  28. static    unsigned int    rs_out        ; /* モデムコントロール                    */
  29.  
  30. void main(int argc,char *argv[])
  31. {
  32.     int i , j , k , l , m ;
  33.     unsigned char *c ;
  34.  
  35.     debug      = 0 ;
  36.     mode      = -1 ;
  37.     rs_out      = 0x03fc ;
  38.     rs_line_s = 0x03fd ;
  39.     rs_in      = 0x03fe ;
  40.     strcpy( command , "" ) ;
  41.     strcpy( path , "" ) ;
  42.  
  43. /* コピーライト表示 */
  44.     copyright() ;
  45.  
  46. /* 割り込み処理定義 */
  47.     signal( SIGINT , sig_out ) ;
  48.  
  49. /* オプションチェック */
  50.     if( argc < 2 ) {
  51.         usage() ;
  52.         exit( 0 ) ;
  53.     }
  54.     else {
  55.         k = l = 0 ;
  56.         for( i=1 ; i<argc ; i++ ) {
  57.             c = argv[i] ;
  58.             if( *c == '-' || *c == '/' ) {
  59.                 switch( *++c ) {
  60.                 case '?' :
  61.                     usage();
  62.                     exit( 0 );
  63.                 case 'i' :
  64.                 case 'I' :
  65.                     debug = -1 ;
  66.                     break ;
  67.                 case 'R' :
  68.                 case 'r' :
  69.                     if( k ) mode = 4 ;
  70.                     else mode = 1 ;
  71.                     break ;
  72.                 case 'S' :
  73.                 case 's' :
  74.                     mode = 0 ;
  75.                     break ;
  76.                 case 'Z' :
  77.                 case 'z' :
  78.                     mode = 2 ;
  79.                     break ;
  80.                 case 'C' :
  81.                 case 'c' :
  82.                     mode = 5 ;
  83.                     c++ ;
  84.                     strcpy( command , c ) ;
  85.                     if( command[0] == '"' ) {
  86.                         for( ; i < argc ; ) {
  87.                             i++ ;
  88.                             strcat( command , " " ) ;
  89.                             strcat( command , argv[i] ) ;
  90.                             if( command[strlen( command ) - 1 ] == '"' ) 
  91.                                 break ;
  92.                         }
  93.                     }
  94.                     break ;
  95.                 case 'X' :
  96.                 case 'x' :
  97.                     c++ ;
  98.                     l = -1 ;
  99.                     strcpy( path , c ) ;
  100.                     break ;
  101.                 case 'P' :
  102.                 case 'p' :
  103.                     c++ ;
  104.                     if( *c != ' ' ) {
  105.                         if( sscanf( c , "%d" , &j ) == EOF )
  106.                             goto perr ;
  107.                         if( j == 0 ) {
  108.                             rs_out      = 0x03fc ;
  109.                             rs_line_s = 0x03fd ;
  110.                             rs_in      = 0x03fe ;
  111.                         }
  112.                         else {
  113.                             if( j == 1 ) {
  114.                                 rs_out      = 0x02fc ;
  115.                                 rs_line_s = 0x02fd ;
  116.                                 rs_in      = 0x02fe ;
  117.                             }
  118.                             else goto perr ;
  119.                         }
  120.                     }
  121.                     else {
  122.                         rs_out      = 0x03fc ;
  123.                         rs_line_s = 0x03fd ;
  124.                         rs_in      = 0x03fe ;
  125.                     }
  126.                     break ;
  127.                 default :
  128. perr:                    printf( "ファイル名が2つ以上指定されているか、誤ったパラメタ(%s)が指定されています。\n" , argv[i] ) ;
  129.                     usage() ;
  130.                     exit( -1 ) ;
  131.                 }
  132.             }
  133.             else {
  134.                 if( mode == 5 ) {
  135.                     if( strlen( command ) > 0 ) goto perr ;
  136.                     strcpy( command , c ) ;
  137.                     if( command[0] == '"' ) {
  138.                         for( ; i < argc ; ) {
  139.                             i++ ;
  140.                             strcat( command , " " ) ;
  141.                             strcat( command , argv[i] ) ;
  142.                             if( command[strlen( command ) - 1 ] == '"' ) 
  143.                                 break ;
  144.                         }
  145.                     }
  146.                     else {
  147.                         for( ; i < argc ; ) {
  148.                             i++ ;
  149.                             if( ( *(argv[i]) == '-' ) || ( *(argv[i]) == '/' ) ) 
  150.                                 break ;
  151.                             strcat( command , " " ) ;
  152.                             strcat( command , argv[i] ) ;
  153.                         }
  154.                     }
  155.                 }
  156.                 else {
  157.                     if( k ) goto perr ;
  158.                     strcpy( name , argv[i] ) ;
  159.                     k = -1 ;
  160.                     if( mode == 1 ) mode = 4 ;
  161.                 }
  162.             }
  163.         }
  164.     }
  165.  
  166. /* オプションの関連チェック */
  167.     if( mode == -1 ) {
  168.         printf( "-r,-s,-z又は-c,の何れかを指定してください。\n" ) ;
  169.         usage() ;
  170.         exit( -1 ) ;
  171.     }
  172.     if( !( k ) && ( mode == 0 ) ) {
  173.         printf( "-s指定時にはファイル名を省略できません。\n" ) ;
  174.         usage() ;
  175.         exit( -1 ) ;
  176.     }
  177.     if( l && ( mode != 0 ) ) {
  178.         printf( "-s 指定時以外にはでは、-xは指定できません。\n" ) ;
  179.         usage() ;
  180.         exit( -1 ) ;
  181.     }
  182.     if( mode == 5 ) {
  183.         strcpy( buffer , command ) ;
  184.         if( buffer[0] == '"' ) {
  185.             m = strlen( buffer ) ;
  186.             if( buffer[m-1] != '"' ) {
  187.                 printf( "コマンドの終わりを示す\"が不足しています。(%s)\n",buffer ) ;
  188.                 usage() ;
  189.                 exit( -1 ) ;
  190.             }
  191.             buffer[m-1] = 0x00 ;
  192.             strcpy( command , ( buffer + 1 ) ) ;
  193.         }
  194.         if( strlen( command ) == 0 ) {
  195.             printf( "-c に続いてリモートコマンドを指定してください。\n" ) ;
  196.             usage() ;
  197.             exit( -1 ) ;
  198.         }
  199.         if( strlen( command ) > 114 ) {
  200.             printf( "申し訳有りませんがコマンドが長すぎます。114文字以下にしてください。\n" ) ;
  201.             usage() ;
  202.             exit( -1 ) ;
  203.         }
  204.     }
  205.  
  206. /* タイムアウト値設定 */
  207.     timeset() ;
  208.  
  209. /* 回線の初期化 */
  210.     rs_init() ;
  211.  
  212. /* 送受信処理へ */
  213.     switch( mode ) {
  214.         case 0 :                /* 送信処理 */
  215.             connect_s() ;
  216.             fp_send() ;
  217.             break ;
  218.         case 1 :                /* 受信処理 */
  219.             connect_r() ;
  220.             fp_receive0() ;
  221.             fp_receive() ;
  222.             break ;
  223.         case 2 :                /* サーバー処理 */
  224.             fp_server() ;
  225.             break ;
  226.         case 4 :                /* サーバーからの受信処理 */
  227.             connect_s() ;
  228.             fp_file() ;
  229.             fp_receive0() ;
  230.             fp_receive() ;
  231.             break ;
  232.         case 5 :                /* リモートコマンド処理 */
  233.             connect_s() ;
  234.             fp_command() ;
  235.             break ;
  236.     }
  237.  
  238. /* 後始末 */
  239.     printf( "電送処理終了しました。\n" ) ;
  240.     rs_init() ;
  241.  
  242. }
  243.  
  244. /* 接続確認待ち(送信型)*/
  245. int connect_s()
  246. {
  247.     unsigned char stat , data ;
  248.  
  249. /* 接続確認 */
  250.     if( mode != 2 ) printf( "接続待ちです。\n" ) ;
  251.     send_cs &= 0x1c ;
  252.     data = send_cs | 0x01 ;
  253.     outp( rs_out , data ) ;        /* ずーと待つからsendは使わない        */
  254.     stat = 0x40 ;
  255.     while( ( inp( rs_in     ) & 0x50 ) != stat ) {
  256.         printf( "*\r" ) ;
  257.         if( kbhit() ) {
  258.             if( getch() == 0x1b ) sig_out() ;
  259.         }
  260.     }
  261.  
  262.     data = send_cs & 0x1c | 0x02 ;
  263.     outp( rs_out , data ) ;        /* ずーと待つからsendは使わない        */
  264.     stat = 0x10 ;
  265.     while( ( inp( rs_in     ) & 0x50 ) != stat ) {
  266.         printf( "*\r" ) ;
  267.         if( kbhit() ) {
  268.             if( getch() == 0x1b ) sig_out() ;
  269.         }
  270.     }
  271.  
  272.     buffer[0] = 0xe4 ;            /* このへんの文字は何でも良い(^^;    */
  273.     if ( send( 1 , buffer ) ) {
  274.         if( mode == 2 ) return( -1 ) ;
  275.         timeout() ;
  276.     }
  277.     if( debug ) printf( "送信接続OK。\n" ) ;
  278.     return( 0 ) ;
  279.  
  280. }
  281.  
  282. /* 回線送信処理 */
  283. int send( int l , unsigned char *b )
  284. {
  285.     int i ;
  286.     long k ;
  287.     unsigned char stat0,stat1,data ;
  288. /* 1バイトを8つに区切って1ビット毎に送信 */
  289.     for( i = 0 ; i < l ; i++ ) {
  290. /* ビット7送信 */
  291.         data = send_cs ;
  292.         stat0 = 0x00 ;
  293.         if( (*b) & 0x80 ) {
  294.             data |= 0x01 ;
  295.             stat0 |= 0x40 ;
  296.         }
  297.         outp( rs_out , data ) ;
  298.         send_cs ^= 0x02 ;
  299. /* ビット6送信 */
  300.         data = send_cs ;
  301.         stat1 = 0x10 ;
  302.         if( (*b) & 0x40 ) {
  303.             data |= 0x01 ;
  304.             stat1 |= 0x40 ;
  305.         }
  306.         for( k = timeout1 ; ( inp( rs_in  ) & 0x50 ) != stat0 ; k-- ) {
  307.             if( !( k ) ) return( -1 )  ;
  308.         }
  309.         outp( rs_out , data ) ;
  310.         send_cs ^= 0x02 ;
  311. /* ビット5送信 */
  312.         data = send_cs ;
  313.         stat0 = 0x00 ;
  314.         if( (*b) & 0x20 ) {
  315.             data |= 0x01 ;
  316.             stat0 |= 0x40 ;
  317.         }
  318.         for( k = timeout1 ; ( inp( rs_in  ) & 0x50 ) != stat1 ; k-- ) {
  319.             if( !( k ) ) return( -1 )  ;
  320.         }
  321.         outp( rs_out , data ) ;
  322.         send_cs ^= 0x02 ;
  323. /* ビット4送信 */
  324.         data = send_cs ;
  325.         stat1 = 0x10 ;
  326.         if( (*b) & 0x10 ) {
  327.             data |= 0x01 ;
  328.             stat1 |= 0x40 ;
  329.         }
  330.         for( k = timeout1 ; ( inp( rs_in  ) & 0x50 ) != stat0 ; k-- ) {
  331.             if( !( k ) ) return( -1 )  ;
  332.         }
  333.         outp( rs_out , data ) ;
  334.         send_cs ^= 0x02 ;
  335. /* ビット3送信 */
  336.         data = send_cs ;
  337.         stat0 = 0x00 ;
  338.         if( (*b) & 0x08 ) {
  339.             data |= 0x01 ;
  340.             stat0 |= 0x40 ;
  341.         }
  342.         for( k = timeout1 ; ( inp( rs_in  ) & 0x50 ) != stat1 ; k-- ) {
  343.             if( !( k ) ) return( -1 )  ;
  344.         }
  345.         outp( rs_out , data ) ;
  346.         send_cs ^= 0x02 ;
  347. /* ビット2送信 */
  348.         data = send_cs ;
  349.         stat1 = 0x10 ;
  350.         if( (*b) & 0x04 ) {
  351.             data |= 0x01 ;
  352.             stat1 |= 0x40 ;
  353.         }
  354.         for( k = timeout1 ; ( inp( rs_in  ) & 0x50 ) != stat0 ; k-- ) {
  355.             if( !( k ) ) return( -1 )  ;
  356.         }
  357.         outp( rs_out , data ) ;
  358.         send_cs ^= 0x02 ;
  359. /* ビット1送信 */
  360.         data = send_cs ;
  361.         stat0 = 0x00 ;
  362.         if( (*b) & 0x02 ) {
  363.             data |= 0x01 ;
  364.             stat0 |= 0x40 ;
  365.         }
  366.         for( k = timeout1 ; ( inp( rs_in  ) & 0x50 ) != stat1 ; k-- ) {
  367.             if( !( k ) ) return( -1 )  ;
  368.         }
  369.         outp( rs_out , data ) ;
  370.         send_cs ^= 0x02 ;
  371. /* ビット0送信 */
  372.         data = send_cs ;
  373.         stat1 = 0x10 ;
  374.         if( (*b) & 0x01 ) {
  375.             data |= 0x01 ;
  376.             stat1 |= 0x40 ;
  377.         }
  378.         for( k = timeout1 ; ( inp( rs_in  ) & 0x50 ) != stat0 ; k-- ) {
  379.             if( !( k ) ) return( -1 )  ;
  380.         }
  381.         outp( rs_out , data ) ;
  382.         for( k = timeout1 ; ( inp( rs_in  ) & 0x50 ) != stat1 ; k-- ) {
  383.             if( !( k ) ) return( -1 )  ;
  384.         }
  385.         send_cs ^= 0x02 ;
  386. /* 次のバイト処理へ */
  387.         b++ ;
  388.     }
  389.  
  390.     return( 0 ) ;
  391.  
  392. }
  393.  
  394. /* 接続確認待ち(受信型)*/
  395. int connect_r()
  396. {
  397.     unsigned char stat , data ;
  398.  
  399. /* 接続確認 */
  400.     if( mode != 2 ) printf( "接続待ちです。\n" ) ;
  401.     send_cs &= 0x1c ;
  402.     stat = 0x40 ;
  403.     while( ( inp( rs_in     ) & 0x50 ) != stat ) {
  404.         printf( "*\r" ) ;
  405.         if( kbhit() ) {
  406.             if( getch() == 0x1b ) sig_out() ;
  407.         }
  408.     }
  409.     data = send_cs & 0x1c | 0x01 ;
  410.     outp( rs_out , data ) ;        /* ずっと待ちたいからreceiveを使わない    */
  411.  
  412.     stat = 0x10 ;
  413.     while( ( inp( rs_in     ) & 0x50 ) != stat ) {
  414.         printf( "*\r" ) ;
  415.         if( kbhit() ) {
  416.             if( getch() == 0x1b ) sig_out() ;
  417.         }
  418.     }
  419.     data = send_cs & 0x1c | 0x02 ;
  420.     outp( rs_out , data ) ;        /* ずっと待ちたいからreceiveを使わない    */
  421.  
  422.     if( receive( 1 , buffer ) ) {
  423.         if( mode == 2 ) return( -1 ) ;
  424.         timeout() ;
  425.     }
  426.     if( buffer[0] != 0xe4 ) {    /* このへんの文字は送信側に合わせる        */
  427.         printf( "接続確認処理でエラーが発生しました。\n" ) ;
  428.         if( mode == 2 ) return( -1 ) ;
  429.         rs_init() ;
  430.         exit( -1 ) ;
  431.     }
  432.     if( debug ) printf( "受信接続OK。\n" ) ;
  433.     return( 0 ) ;
  434.  
  435. }
  436.  
  437. /* 回線受信処理 */
  438. int receive( int l , unsigned char *b )
  439. {
  440.     int i ;
  441.     long k , t ;
  442.     unsigned char data ;
  443.  
  444. /* 1ビットを8つ受信で1バイト */
  445.     for( i = 0 ; i < l ; i++ ) {
  446.         *b = 0x00 ;
  447. /* ビット7受信 */
  448.         for( k = timeout1 ; inp( rs_in    ) & 0x10 ; k-- ) {
  449.             if( !( k ) ) return( -1 )  ;
  450.         }
  451.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  452.         data = send_cs ;
  453.         if( inp( rs_in ) & 0x40 ) {
  454.                 (*b) |= 0x80 ;
  455.             data |= 0x01 ;
  456.         }
  457.         outp( rs_out , data ) ;
  458.         send_cs ^= 0x02 ;
  459. /* ビット6受信 */
  460.         for( k = timeout1 ; !( inp( rs_in  ) & 0x10 ) ; k-- ) {
  461.             if( !( k ) ) return( -1 )  ;
  462.         }
  463.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  464.         data = send_cs ;
  465.         if( inp( rs_in ) & 0x40 ) {
  466.                 (*b) |= 0x40 ;
  467.             data |= 0x01 ;
  468.         }
  469.         outp( rs_out , data ) ;
  470.         send_cs ^= 0x02 ;
  471. /* ビット5受信 */
  472.         for( k = timeout1 ; inp( rs_in    ) & 0x10 ; k-- ) {
  473.             if( !( k ) ) return( -1 )  ;
  474.         }
  475.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  476.         data = send_cs ;
  477.         if( inp( rs_in ) & 0x40 ) {
  478.                 (*b) |= 0x20 ;
  479.             data |= 0x01 ;
  480.         }
  481.         outp( rs_out , data ) ;
  482.         send_cs ^= 0x02 ;
  483. /* ビット4受信 */
  484.         for( k = timeout1 ; !( inp( rs_in  ) & 0x10 ) ; k-- ) {
  485.             if( !( k ) ) return( -1 )  ;
  486.         }
  487.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  488.         data = send_cs ;
  489.         if( inp( rs_in ) & 0x40 ) {
  490.                 (*b) |= 0x10 ;
  491.             data |= 0x01 ;
  492.         }
  493.         outp( rs_out , data ) ;
  494.         send_cs ^= 0x02 ;
  495. /* ビット3受信 */
  496.         for( k = timeout1 ; inp( rs_in    ) & 0x10 ; k-- ) {
  497.             if( !( k ) ) return( -1 )  ;
  498.         }
  499.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  500.         data = send_cs ;
  501.         if( inp( rs_in ) & 0x40 ) {
  502.                 (*b) |= 0x08 ;
  503.             data |= 0x01 ;
  504.         }
  505.         outp( rs_out , data ) ;
  506.         send_cs ^= 0x02 ;
  507. /* ビット2受信 */
  508.         for( k = timeout1 ; !( inp( rs_in  ) & 0x10 ) ; k-- ) {
  509.             if( !( k ) ) return( -1 )  ;
  510.         }
  511.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  512.         data = send_cs ;
  513.         if( inp( rs_in ) & 0x40 ) {
  514.                 (*b) |= 0x04 ;
  515.             data |= 0x01 ;
  516.         }
  517.         outp( rs_out , data ) ;
  518.         send_cs ^= 0x02 ;
  519. /* ビット1受信 */
  520.         for( k = timeout1 ; inp( rs_in    ) & 0x10 ; k-- ) {
  521.             if( !( k ) ) return( -1 )  ;
  522.         }
  523.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  524.         data = send_cs ;
  525.         if( inp( rs_in ) & 0x40 ) {
  526.                 (*b) |= 0x02 ;
  527.             data |= 0x01 ;
  528.         }
  529.         outp( rs_out , data ) ;
  530.         send_cs ^= 0x02 ;
  531. /* ビット0受信 */
  532.         for( k = timeout1 ; !( inp( rs_in  ) & 0x10 ) ; k-- ) {
  533.             if( !( k ) ) return( -1 )  ;
  534.         }
  535.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  536.         data = send_cs ;
  537.         if( inp( rs_in ) & 0x40 ) {
  538.                 (*b) |= 0x01 ;
  539.             data |= 0x01 ;
  540.         }
  541.         outp( rs_out , data ) ;
  542.         send_cs ^= 0x02 ;
  543. /* 次のバイト処理へ */
  544.         b++ ;
  545.     }
  546.  
  547.     return( 0 ) ;
  548.  
  549. }
  550.  
  551. /* 8250の初期化 */
  552. void rs_init()
  553. {
  554.  
  555. /* ラインステータスレジスタ */
  556.     inp( rs_line_s ) ;
  557.  
  558. /* モデムコントロールレジスタ */
  559.     send_cs = ( inp( rs_out ) & 0x1c ) ;
  560.     outp( rs_out , ( send_cs & 0xfc ) ) ;
  561.  
  562. }
  563.  
  564. /* コピーライト表示 */
  565. void copyright()
  566. {
  567.     printf(
  568.         "IBM<=>98<=>FMR ファイル電送 for IBM Ver 1.01, Copyright (C) E.Suto , 1992-1993\n"
  569.         ) ;
  570. }
  571.  
  572. /* 使い方表示 */
  573. void usage()
  574. {
  575.     printf( "使用法                 : IPLINKI [options] [file-name]\n" ) ;
  576.     printf( "オプション -s            : ファイル送信(要送信ファイル名)\n" ) ;
  577.     printf( "      -r            : ファイル受信\n" ) ;
  578.     printf( "      -z            : サーバーモード\n" ) ;
  579.     printf( "      -cリモートコマンド  : サーバーにリモートコマンドを送信\n" ) ;
  580.     printf( "      -x[path_name] : -sでの格納先パス名\n" ) ;
  581.     printf( "      -p            : ポート番号[0/1]デフォルト0\n" ) ;
  582.     printf( "          -i            : 詳細情報表示\n" ) ;
  583. }
  584.  
  585.